import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

# 再次尝试读取文件的正确路径并进行分析
file_path = '附件一（训练集）.xlsx'
#比赛结束前最后一天售后群发布无水印可视化结果+无标注代码【可直接提交】为了防止倒卖， 论文写作过程中遗留数个致命问题，无关代码，该问题解决方式仅在官网授权售后群答疑，盗卖方式购买资料不提供答疑，感谢理解2024年研赛资料助攻购买链接+说明https://docs.qq.com/doc/p/e03d6bffc00b392932b7dc1fbcf746ef9b086a8a
# 读取上传的xlsx文件
data = pd.read_excel(file_path)

# 选择第二列和第三列，分别为频率和磁芯损耗
df = data.iloc[:, [1, 2]]
df.columns = ['frequency', 'core_loss']

# 绘制频率和磁芯损耗的分布图，判定分布类型
plt.figure(figsize=(12, 6))

# 绘制频率分布图
plt.subplot(1, 2, 1)
sns.histplot(df['frequency'], kde=True)
plt.title('Frequency Distribution')

# 绘制磁芯损耗分布图
plt.subplot(1, 2, 2)
sns.histplot(df['core_loss'], kde=True)
plt.title('Core Loss Distribution')

plt.tight_layout()
plt.show()

# 检验是否符合正态分布 (Shapiro-Wilk test)
shapiro_freq = stats.shapiro(df['frequency'])#比赛结束前最后一天售后群发布无水印可视化结果+无标注代码【可直接提交】为了防止倒卖， 论文写作过程中遗留数个致命问题，无关代码，该问题解决方式仅在官网授权售后群答疑，盗卖方式购买资料不提供答疑，感谢理解2024年研赛资料助攻购买链接+说明https://docs.qq.com/doc/p/e03d6bffc00b392932b7dc1fbcf746ef9b086a8a
shapiro_core_loss = stats.shapiro(df['core_loss'])


# 判定是否为正态分布
def is_normal_distribution(p_value, alpha=0.05):
    return p_value > alpha


freq_is_normal = is_normal_distribution(shapiro_freq.pvalue)
core_loss_is_normal = is_normal_distribution(shapiro_core_loss.pvalue)


# 使用箱线图处理非正态分布的数据、3σ法处理正态分布数据
def detect_outliers_boxplot(data, feature_name):
    plt.figure(figsize=(8, 6))
    sns.boxplot(data=data, y=feature_name)
    plt.title(f'Boxplot for {feature_name}')
    plt.show()

#比赛结束前最后一天售后群发布无水印可视化结果+无标注代码【可直接提交】为了防止倒卖， 论文写作过程中遗留数个致命问题，无关代码，该问题解决方式仅在官网授权售后群答疑，盗卖方式购买资料不提供答疑，感谢理解2024年研赛资料助攻购买链接+说明https://docs.qq.com/doc/p/e03d6bffc00b392932b7dc1fbcf746ef9b086a8a
def detect_outliers_3sigma(data, feature_name):
    mean = np.mean(data)
    std_dev = np.std(data)
    upper_bound = mean + 3 * std_dev
    lower_bound = mean - 3 * std_dev
    outliers = data[(data < lower_bound) | (data > upper_bound)]

    # 可视化3σ结果
    plt.figure(figsize=(8, 6))
    sns.histplot(data, kde=True)
    plt.axvline(upper_bound, color='r', linestyle='--', label=f'Upper Bound: {upper_bound:.2f}')
    plt.axvline(lower_bound, color='r', linestyle='--', label=f'Lower Bound: {lower_bound:.2f}')
    plt.title(f'3-Sigma Outlier Detection for {feature_name}')
    plt.legend()
    plt.show()

    return outliers


# 判断并绘制结果
if freq_is_normal:
    print("Frequency follows a normal distribution, applying 3-Sigma method.")
    freq_outliers = detect_outliers_3sigma(df['frequency'], 'frequency')
else:
    print("Frequency does not follow a normal distribution, applying Boxplot method.")
    detect_outliers_boxplot(df, 'frequency')

if core_loss_is_normal:
    print("Core loss follows a normal distribution, applying 3-Sigma method.")
    core_loss_outliers = detect_outliers_3sigma(df['core_loss'], 'core_loss')#比赛结束前最后一天售后群发布无水印可视化结果+无标注代码【可直接提交】为了防止倒卖， 论文写作过程中遗留数个致命问题，无关代码，该问题解决方式仅在官网授权售后群答疑，盗卖方式购买资料不提供答疑，感谢理解2024年研赛资料助攻购买链接+说明https://docs.qq.com/doc/p/e03d6bffc00b392932b7dc1fbcf746ef9b086a8a
else:
    print("Core loss does not follow a normal distribution, applying Boxplot method.")
    detect_outliers_boxplot(df, 'core_loss')
